package JVM.第05篇_执行引擎篇;

/**
 * 两个编译器
 * 在HotSpot VM中内嵌有两个JIT编译器，
 * 分别为Client Compiler 和Server Compiler(默认),
 * 但大多数情况下我们简称为C1编译器和C2编译器。
 * 开发人员可以通过如下命令显式指定Java虚拟机在运行时到底使用哪一种即时编译器，
 *
 * 如下所示:
 * ●-client: 指定Java虚拟机运行在Client模式下， 并使用C1编译器;
 *      ●C1编译器会对字节码进行简单和可靠的优化，耗时短。以达到更快的编译速度。
 *      ●client启动快，占用内存小，执行效率没有server快，默认情况下不进行动态编译，
 *      适用于桌面应用程序。
 * ●-server:指定Java虚拟机运行在Server模式下，并使用C2编译器。
 *      ●C2进行耗时较长的优化，以及激进优化。但优化的代码执行效率更高。
 *      ●server启动慢， 占用内存多，执行效率高，适用于服务器端应用;
 *
 *
 * 由-XX:+RewriteFrequentPairs参数控制。client 模式默认关闭，server 模式默认开启。
 *
 * C1和C2编译器不同的优化策略:
 * ●在不同的编译器上有不同的优化策略，C1编译器上主要有方法内联，去虚拟化、冗余消除。
 *      ●方法内联:将引用的函数代码编译到引用点处，这样可以减少栈帧的生成，
 *      减少参数传递以及跳转过程
 *      ●去虚拟化:对唯一的实现类进行内联
 *      ●冗余消除:在运行期间把一些不会执行的代码折叠掉
 * ●C2的优化主要是在全局层面，逃逸分析是优化的基础。基于逃逸分析在C2上有如下几种优化:
 *      ●标量替换:用标量值代替聚合对象的属性值
 *      ●栈上分配:对于未逃逸的对象分配对象在栈而不是堆
 *      ●同步消除:清除同步操作，通常指synchronized
 *
 *
 * 总结:
 * ●一般来讲，JIT编译出来的机器码性能比解释器高。
 * ●C2编译器启动时长比C1编译器慢，系统稳定执行以后，C2编译器执行速度远远快于C1编译器
 *
 *
 */
public class D2_HotSpotVM执行的方式 {

}
